package com.guidecaptain.core.base.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.support.TransactionTemplate;

/**
 * 所有主表实体（Entity）对应的实体Service应当继承本类,而从表则应当与主表共用同一个实体服务。
 * 实体服务输入输出的Model对象应当是POJO以及String(主要是ID)。
 * 
 * 请注意：
 * 1）实体服务类的方法（增/删/改）用于：维护表实体的数据一致性与正确性，关注于数据逻辑。
 * 2）实体服务类的命名规范：<表名>+EntityServiceImpl
 * 3）实体服务类中，才提供事务模板。
 * 4）一个实体服务类中仅注入一个自己的Dao（基类已经提供方法）。但仅限于使用方法(增/删/改)。
 * 5）实体服务类可以自行注入相关联的实体服务类（严禁注入业务服务类）。此时可以用事务模板。
 * 6）方法统一使用RuntimeException，作事务控制。
 * 
 * 方法中的事务代码范本
 * A.有结果返回：
 * public boolean transfer(final Long fromId) {
		return (Boolean) getTransactionTemplate().execute(new TransactionCallback<Object>() {
			public Object doInTransaction(TransactionStatus status) {
				Object result;
				try {
					// result = bankDao.transfer(fromId， toId， amount);
					result=true;
				} catch (Exception e) {
					status.setRollbackOnly();
					result = false;
					System.out.println("Transfer Error!");
				}
				return result;
			}
		});
	}
 *
 * B.无结果返回：
 * public void transfer(final double amount) {
	 getTransactionTemplate().execute(new TransactionCallbackWithoutResult() {
		protected void doInTransactionWithoutResult(TransactionStatus status) {
			// TODO Auto-generated method stub
			
		}
	 });
   }
 * 
 */

public abstract class TransactionService {
	private TransactionTemplate transactionTemplate;

	public TransactionTemplate getTransactionTemplate() {
		return transactionTemplate;
	}

	@Autowired
	public void setTransactionTemplatet(TransactionTemplate transactionTemplate) {
		this.transactionTemplate = transactionTemplate;
	}
}
